home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 5 / Amiga Tools 5.iso / tools / system-tools / tinymeter / source / tinymeter_main / launchclass.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-21  |  13.5 KB  |  476 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <dos/dos.h>
  4. #include <dos/dosextens.h>
  5. #include <intuition/intuition.h>
  6. #include <intuition/gadgetclass.h>
  7. #include <intuition/intuitionbase.h>
  8. #include <intuition/classusr.h>
  9. #include <intuition/imageclass.h>
  10. #include <intuition/gadgetclass.h>
  11. #include <intuition/cghooks.h>
  12. #include <intuition/icclass.h>
  13. #include <intuition/classes.h>
  14. #include <intuition/sghooks.h>
  15. #include <intuition/screens.h>
  16. #include <graphics/gfxbase.h>
  17. #include <graphics/text.h>
  18. #include <graphics/gfxmacros.h>
  19. #include <utility/tagitem.h>
  20. #include <utility/hooks.h>
  21. #include <datatypes/datatypesclass.h>
  22. #include <datatypes/datatypes.h>
  23. #include <datatypes/pictureclass.h>
  24. #include <string.h>
  25. #include "launchclass.h"
  26.  
  27. #define err_nolis       7
  28.  
  29. #define col_label       0
  30. #define col_entry       1
  31. #define col_hbright     2
  32. #define col_hdark       3
  33. #define col_cursor      4
  34. #define col_bright      5
  35. #define col_dark        6
  36. #define col_bg          7
  37.  
  38. #define ind_centered    0
  39. #define ind_left        1
  40. #define ind_right       2
  41.  
  42. struct LauncherData
  43. {
  44.     struct  Screen *scr;
  45.     char    *txtlbl;
  46.     char    *file;
  47.     struct  LAU_Color Colors[LAU_UsedColors+1];
  48.     BOOL    Style3D;
  49.     BOOL    StyleBorder;
  50.     BOOL    StyleBackground;
  51.     BOOL    StyleShadowLabel;
  52.     struct  TextFont *textFont;
  53.     ULONG   Pens[LAU_UsedColors];
  54.     BOOL    PorC[LAU_UsedColors];
  55.     BOOL    InitNotDone;
  56.     UWORD   text_y;
  57.     UWORD   indent;
  58.     struct  lau_entry *list;
  59.     ULONG   down;
  60.     Object  *img;
  61. };
  62.  
  63. ULONG dispatchLauncherGadget(Class *cl,Object *o, Msg msg);
  64. ULONG newLauncher(Class *cl,struct Gadget *g,struct gpRender *msg);
  65. ULONG renderLauncher(Class *cl,struct Gadget *g, struct gpRender *msg);
  66. ULONG getLauncher(Class *cl,struct Gadget *g,struct gpRender *msg);
  67. setLauncher(Class *cl,struct Gadget *g,struct gpRender *msg);
  68. extern ULONG HookEntry();
  69.  
  70. __geta4 ULONG dispatchLauncherGadget(Class *cl,Object *o, Msg msg)
  71. {
  72.     switch( msg->MethodID )
  73.     {
  74.     case    OM_NEW:
  75.         if(o = (Object *)DoSuperMethodA(cl, o, msg) )
  76.         {
  77.             newLauncher(cl,(struct Gadget *)o,(struct gpRender *)msg);
  78.         }
  79.         return((ULONG)o);
  80.     case    GM_RENDER:
  81.         return(renderLauncher(cl,(struct Gadget *)o,(struct gpRender *)msg));
  82.     case    OM_SET:
  83.         setLauncher((Class *)cl,(struct Gadget *)o,(struct gpRender *)msg);
  84.         return(DoSuperMethodA(cl,o,msg));
  85.     case    OM_GET:
  86.         return((ULONG)getLauncher(cl,(struct Gadget *)o,(struct gpRender *)msg));
  87.     case    GM_HITTEST:
  88.         return(GMR_GADGETHIT);
  89.     case    GM_GOACTIVE:
  90.         if( ((struct gpInput *)msg)->gpi_IEvent )
  91.         {
  92.             ((struct Gadget *)o)->Flags |= GFLG_SELECTED;
  93.             renderLauncher(cl,(struct Gadget *)o, (struct gpRender *)msg);
  94.             return(GMR_MEACTIVE);
  95.         }
  96.         return(GMR_NOREUSE);
  97.     case    GM_GOINACTIVE:
  98.         ((struct Gadget *)o)->Flags &= ~GFLG_SELECTED;
  99.         renderLauncher(cl,(struct Gadget *) o, (struct gpRender *)msg);
  100.         return(FALSE);
  101.     case    GM_HANDLEINPUT:
  102.         {
  103.             struct Gadget *g = (struct Gadget *)o;
  104.             struct gpInput *gpi = (struct gpInput *)msg;
  105.             struct InputEvent *ie = gpi->gpi_IEvent;
  106.             ULONG  retval=GMR_MEACTIVE;
  107.  
  108.             if( ie->ie_Class== IECLASS_RAWMOUSE)
  109.             {
  110.             switch( ie->ie_Code )
  111.             {
  112.                 case SELECTUP:
  113.                     if( (gpi->gpi_Mouse.X < g->LeftEdge ) ||
  114.                     (gpi->gpi_Mouse.X > g->LeftEdge + g->Width) ||
  115.                     (gpi->gpi_Mouse.Y < g->TopEdge ) ||
  116.                     (gpi->gpi_Mouse.Y > g->TopEdge  + g->Height) )
  117.                     {
  118.                     retval= GMR_NOREUSE | GMR_VERIFY;
  119.                     }
  120.                     else
  121.                     {
  122.                     retval= GMR_NOREUSE ;
  123.                     }
  124.                     break;
  125.                 case MENUDOWN:
  126.                     retval= GMR_NOREUSE;
  127.                     break;
  128.                 default:
  129.                     retval= GMR_MEACTIVE;
  130.                     break;
  131.             }
  132.             }
  133.             return(retval);
  134.         }
  135.     case    OM_DISPOSE:
  136.         {
  137.             struct lau_entry *entry;
  138.             struct LauncherData *inst=INST_DATA(cl,o);
  139.             int w;
  140.             for(w=0;w<LAU_UsedColors;w++)FreePenNew(inst->scr,&inst->Colors[w],w,inst->Pens);
  141.             if(inst->txtlbl)FreeVec(inst->txtlbl);
  142.             DisposeDTObject(inst->img);
  143.             while(inst->list)
  144.             {
  145.             entry = inst->list->next;
  146.             DisposeDTObject(inst->list->img);
  147.             FreeVec  (inst->list->lau_lbl);
  148.             FreeVec  (inst->list->lau_cmd);
  149.             FreeVec  (inst->list->lau_pth);
  150.             FreeVec  (inst->list->lau_out);
  151.             FreeVec  (inst->list);
  152.             inst->list=entry;
  153.             }
  154.         }
  155.     default:
  156.         return(DoSuperMethodA(cl,o,msg));
  157.     }
  158. }
  159.  
  160. Class *initLauncherGadgetClass(void)
  161. {
  162.     Class *cl;
  163.     if( cl = (Class *)MakeClass( NULL, "gadgetclass", NULL, sizeof(struct LauncherData), 0) )
  164.     {
  165.     cl->cl_Dispatcher.h_Entry    = HookEntry;
  166.     cl->cl_Dispatcher.h_SubEntry = (HOOKFUNC)dispatchLauncherGadget;
  167.     }
  168.     return(cl);
  169. }
  170.  
  171. setLauncher(Class *cl,struct Gadget *g,struct gpRender *msg)
  172. {
  173.     struct LauncherData    *inst=INST_DATA(cl,g);
  174.     if ( FindTagItem(GA_Width,  ((struct opSet *)msg)->ops_AttrList) ||
  175.      FindTagItem(GA_Height, ((struct opSet *)msg)->ops_AttrList) ||
  176.      FindTagItem(GA_Top,    ((struct opSet *)msg)->ops_AttrList) ||
  177.      FindTagItem(GA_Left,   ((struct opSet *)msg)->ops_AttrList) )
  178.     {
  179.     inst->InitNotDone=TRUE;
  180.     }
  181. }
  182.  
  183. ULONG getLauncher(Class *cl,struct Gadget *g,struct gpRender *msg)
  184. {
  185.     struct LauncherData *inst=INST_DATA(cl,g);
  186.     switch (((struct opGet *)msg)->opg_AttrID)
  187.     {
  188.     case    LAU_Down:
  189.         *(((struct opGet *)msg)->opg_Storage)=(ULONG)inst->down;
  190.         break;
  191.     case    LAU_List:
  192.         *(((struct opGet *)msg)->opg_Storage)=(ULONG)inst->list;
  193.         break;
  194.     case    LAU_ColLabel:
  195.         *(((struct opGet *)msg)->opg_Storage)=(ULONG)inst->Pens[0];
  196.         break;
  197.     case    LAU_ColEntry:
  198.         *(((struct opGet *)msg)->opg_Storage)=(ULONG)inst->Pens[1];
  199.         break;
  200.     case    LAU_ColHalfBright:
  201.         *(((struct opGet *)msg)->opg_Storage)=(ULONG)inst->Pens[2];
  202.         break;
  203.     case    LAU_ColHalfShadow:
  204.         *(((struct opGet *)msg)->opg_Storage)=(ULONG)inst->Pens[3];
  205.         break;
  206.     case    LAU_ColCursor:
  207.         *(((struct opGet *)msg)->opg_Storage)=(ULONG)inst->Pens[4];
  208.         break;
  209.     case    LAU_ColBrightEdg:
  210.         *(((struct opGet *)msg)->opg_Storage)=(ULONG)inst->Pens[5];
  211.         break;
  212.     case    LAU_ColDarkEdg:
  213.         *(((struct opGet *)msg)->opg_Storage)=(ULONG)inst->Pens[6];
  214.         break;
  215.     case    LAU_ColBackground:
  216.         *(((struct opGet *)msg)->opg_Storage)=(ULONG)inst->Pens[7];
  217.         break;
  218.     default:
  219.         *(((struct opGet *)msg)->opg_Storage)=0;
  220.         break;
  221.     }
  222.     return((ULONG)TRUE);
  223. }
  224.  
  225.  
  226. BOOL freeLauncherGadgetClass( Class *cl )
  227. {
  228.     return(FreeClass(cl));
  229. }
  230.  
  231. CleanString(char *buffer)
  232. {
  233.     int i;
  234.      if(!(i=my_strlen(buffer))) buffer[0]=0x00;
  235.     else if(buffer[i-1]==0x0a) buffer[i-1]=0x00;
  236. }
  237.  
  238. StripSpaces(char *src, char *dest)
  239. {
  240.     int i,j;
  241.     BOOL foo=FALSE;
  242.     if(src[my_strlen(src)-1]==0x20)
  243.     {
  244.     for(i=my_strlen(src)-1;i>-1;i--) if(src[i]==0x20) src[i]=0x0; else break;
  245.     }
  246.     for(i=0,j=0;i<my_strlen(src);i++) if((src[i]!=0x20)||(foo==TRUE))
  247.     {
  248.     if(src[i]!=0x0a) dest[j++]=src[i];
  249.     foo=TRUE;
  250.     }
  251.     dest[j]=0;
  252. }
  253.  
  254. CopyString(char *src, char **dest, struct LauncherData *inst)
  255. {
  256.     if(my_strlen(src))
  257.     {
  258.     *dest=(char *)AllocVec(my_strlen(src)+4L,0L);
  259.     StripSpaces(src,*dest);
  260.     }
  261.     else *dest=(char *)AllocVec(4L,MEMF_CLEAR);
  262. }
  263.  
  264. ULONG newLauncher(Class *cl,struct Gadget *g,struct gpRender *msg)
  265. {
  266.     struct   TagItem *ti;
  267.     struct   LauncherData *inst=INST_DATA(cl,g);
  268.     BPTR     file;
  269.  
  270.     ti      = ((struct opSet *)msg)->ops_AttrList;
  271.     if(inst->scr = (struct Screen *)GetTagData(LAU_Screen, 0, ti))
  272.     {
  273.     if(inst->textFont = (struct TextFont *)GetTagData(LAU_TextFont,OpenTopaz(),ti))
  274.     {
  275.         char *dummy;
  276.         if(dummy=(char *)AllocVec(256L,0L))
  277.         {
  278.         int     i;
  279.         UWORD   def_pens[]={ 2, 2, 1, 3, 1, 2, 1, 0 };
  280.         ULONG   lau_tags[]={LAU_ColLabel,LAU_ColEntry,LAU_ColHalfBright,LAU_ColHalfShadow,LAU_ColCursor,LAU_ColBrightEdg,LAU_ColDarkEdg,LAU_ColBackground};
  281.  
  282.         inst->file              = (char *)GetTagData(LAU_File, " ", ti);
  283.         inst->Style3D           = GetTagData(LAU_3D,  TRUE, ti);
  284.         inst->StyleBorder       = GetTagData(LAU_Border, TRUE, ti);
  285.         inst->StyleBackground   = GetTagData(LAU_Background, FALSE, ti);
  286.         inst->StyleShadowLabel  = GetTagData(LAU_ShadowLabel, FALSE, ti);
  287.         inst->down              = GetTagData(LAU_Down, FALSE, ti);
  288.         inst->indent            = GetTagData(LAU_Indent, lind_realcenter, ti);
  289.         for(i=0;i<LAU_UsedColors;i++) CopyMem(GetTagData(lau_tags[i],GetGaugePen(def_pens[i]), ti), &inst->Colors[i], sizeof(struct LAU_Color));
  290.         inst->InitNotDone=TRUE;
  291.         if(file=Open(inst->file,MODE_OLDFILE))
  292.         {
  293.             if(FGets(file,dummy,255))
  294.             {
  295.             if(*((ULONG *)dummy)==0x544D4C49)
  296.             {
  297.                 if(FGets(file,dummy,255))
  298.                 {
  299.                 CopyString(dummy,&inst->txtlbl,inst);
  300.                 if(FGets(file,dummy,255))
  301.                 {
  302.                     CleanString(dummy);
  303.                     if(dummy[0])inst->img=(Object *)LoadImage(dummy,inst->scr);
  304.                     else        inst->img=0L;
  305.                     if(inst->list=(struct lau_entry *)AllocVec(sizeof(struct lau_entry),MEMF_CLEAR))
  306.                     {
  307.                     struct lau_entry *oldentry,*actentry=inst->list;
  308.                     while(FGets(file,dummy,32))
  309.                     {
  310.                         CopyString(dummy,&actentry->lau_lbl,inst);
  311.                         FGets(file,dummy,255);
  312.                         CopyString(dummy,&actentry->lau_cmd,inst);
  313.                         FGets(file,dummy,8);
  314.                         CleanString(dummy);
  315.                         actentry->lau_type=dummy[0]-0x30;
  316.                         FGets(file,dummy,255);
  317.                         CopyString(dummy,&actentry->lau_pth,inst);
  318.                         FGets(file,dummy,255);
  319.                         CopyString(dummy,&actentry->lau_out,inst);
  320.                         FGets(file,dummy,16);
  321.                         CleanString(dummy);
  322.                         {
  323.                         LONG i,j=1,out=0L;
  324.                         for(i=my_strlen(dummy)-1;i>-1;i--)
  325.                         {
  326.                             if((dummy[i]>0x29)&&(dummy[i]<0x3A))
  327.                             {
  328.                             out+=((dummy[i]-0x30)*j);
  329.                             j*=10;
  330.                             }
  331.                         }
  332.                         actentry->lau_stack=out;
  333.                         }
  334.                         FGets(file,dummy,255);
  335.                         CleanString(dummy);
  336.                         if(dummy[0]) actentry->img=(Object *)LoadImage(dummy,inst->scr);
  337.                         else         actentry->img=0L;
  338.  
  339.                         oldentry=actentry;
  340.                         actentry=(struct lau_entry *)AllocVec(sizeof(struct lau_entry),MEMF_CLEAR);
  341.                         oldentry->next=actentry;
  342.                     }
  343.                     FreeVec(actentry);
  344.                     oldentry->next=NULL;
  345.                     }
  346.                     else
  347.                     {
  348.                     FreeVec(inst->list);
  349.                     inst->list=NULL;
  350.                     }
  351.                 }
  352.                 }
  353.                 else show(err_nolis);
  354.             }
  355.             else show(err_nolis);
  356.             }
  357.             else show(err_nolis);
  358.             Close(file);
  359.         }
  360.         FreeVec(dummy);
  361.         return((ULONG)g);
  362.         }
  363.     }
  364.     }
  365.     return(0L);
  366. }
  367.  
  368. ULONG renderLauncher(Class *cl,struct Gadget *g,struct gpRender *msg)
  369. {
  370.     struct  RastPort        *rp;
  371.     UWORD                   text_x,w,t_length;
  372.     struct BitMapHeader     *bmhd;
  373.     struct LauncherData     *inst=INST_DATA(cl,(Object *)g);
  374.  
  375.     if(rp = ( msg->MethodID == GM_RENDER ) ? msg->gpr_RPort : (struct RastPort *) ObtainGIRPort(msg->gpr_GInfo) )
  376.     {
  377.     if(inst->InitNotDone) for(w=0;w<LAU_UsedColors;w++) GetPenNew(msg,&inst->Colors[w],w,inst->PorC,inst->Pens);
  378.  
  379.     SetDrMd(rp,JAM1);
  380.     SetFont(rp,inst->textFont);
  381.  
  382.     inst->text_y=((g->Height-((inst->textFont->tf_Baseline+inst->textFont->tf_YSize)>>1))>>1);
  383.     if(inst->textFont->tf_Baseline<inst->textFont->tf_YSize)
  384.     {
  385.         inst->text_y+=inst->textFont->tf_Baseline-1;
  386.         if(inst->text_y<inst->textFont->tf_Baseline)inst->text_y=inst->textFont->tf_Baseline;
  387.     }
  388.     else
  389.     {
  390.         inst->text_y+=inst->textFont->tf_YSize-1;
  391.         if(inst->text_y<inst->textFont->tf_YSize)   inst->text_y=inst->textFont->tf_YSize;
  392.     }
  393.     SetAPen(rp,inst->Pens[col_bg]);
  394.     if(inst->StyleBackground) my_RectFill(rp,g->LeftEdge,g->TopEdge,g->Width,g->Height);
  395.     if(inst->img)
  396.     {
  397.         struct BitMap       *bm;
  398.         UWORD               y,height,ypos;
  399.  
  400.         GetDTAttrs(inst->img,PDTA_BitMapHeader,&bmhd,PDTA_DestBitMap,&bm,TAG_DONE);
  401.         if (!bm) GetDTAttrs(inst->img,PDTA_BitMap,&bm,TAG_DONE);
  402.  
  403.         if(bmhd->bmh_Height>(g->Height-6))
  404.         {
  405.         height=(g->Height-6);
  406.         y=(bmhd->bmh_Height-height)>>1;
  407.         ypos=3;
  408.         }
  409.         else
  410.         {
  411.         height=bmhd->bmh_Height;
  412.         y=0;
  413.         ypos=(g->Height/2)-(height/2);
  414.         }
  415.         BltBitMapRastPort(bm,0,y,rp,g->LeftEdge+4,g->TopEdge+ypos,bmhd->bmh_Width,height,0xc0);
  416.     }
  417.     if(inst->StyleBorder)
  418.     {
  419.         if(inst->Style3D)
  420.         {
  421.         draw_border_new(rp,g->LeftEdge,g->TopEdge,g->Width,g->Height,inst->Pens[col_dark],inst->Pens[col_dark]);
  422.         if(g->Flags & GFLG_SELECTED)draw_border_new(rp,g->LeftEdge+1,g->TopEdge+1,g->Width-2,g->Height-2,inst->Pens[col_hdark],inst->Pens[col_bright]);
  423.         else                        draw_border_new(rp,g->LeftEdge+1,g->TopEdge+1,g->Width-2,g->Height-2,inst->Pens[col_bright],inst->Pens[col_hdark]);
  424.         }
  425.         else
  426.         {
  427.         if(g->Flags & GFLG_SELECTED)draw_border_new(rp,g->LeftEdge,g->TopEdge,g->Width,g->Height,inst->Pens[col_hdark],inst->Pens[col_bright]);
  428.         else                        draw_border_new(rp,g->LeftEdge,g->TopEdge,g->Width,g->Height,inst->Pens[col_bright],inst->Pens[col_hdark]);
  429.         }
  430.     }
  431.     t_length=TextLength(rp,inst->txtlbl,my_strlen(inst->txtlbl));
  432.     if(t_length<(g->Width - ((inst->indent==lind_left)||(inst->indent==lind_center) ? ( bmhd ? bmhd->bmh_Width : 0 )  : 0)))
  433.     {
  434.         switch(inst->indent)
  435.         {
  436.         case    lind_center:
  437.             if(bmhd) text_x=bmhd->bmh_Width+((g->Width-t_length-bmhd->bmh_Width)>>1);
  438.             else     text_x=((g->Width-t_length)>>1);
  439.             break;
  440.         case    lind_left:
  441.             if(bmhd) text_x=bmhd->bmh_Width+11;
  442.             else     text_x=5;
  443.             break;
  444.         case    lind_right:
  445.             text_x=g->Width-t_length-5;
  446.             break;
  447.         default :
  448.             text_x=((g->Width-t_length)>>1);
  449.             break;
  450.         }
  451.         if(inst->StyleShadowLabel)
  452.         {
  453.         SetAPen(rp,inst->Pens[col_dark]);
  454.         Move(rp,text_x+g->LeftEdge+1,inst->text_y+g->TopEdge+1);
  455.         Text(rp,inst->txtlbl,my_strlen(inst->txtlbl));
  456.         }
  457.         if(g->Flags & GFLG_SELECTED)
  458.         {
  459.         Move(rp,text_x+g->LeftEdge+1,inst->text_y+g->TopEdge+1);
  460.         }
  461.         else
  462.         {
  463.         Move(rp,text_x+g->LeftEdge,inst->text_y+g->TopEdge);
  464.         }
  465.         SetAPen(rp,inst->Pens[col_label]);
  466.         Text(rp,inst->txtlbl,my_strlen(inst->txtlbl));
  467.     }
  468.     inst->InitNotDone=FALSE;
  469.     if(msg->MethodID !=GM_RENDER) ReleaseGIRPort(rp);
  470.     return(TRUE);
  471.     }
  472.     return(FALSE);
  473. }
  474.  
  475.  
  476.